package 类与对象.内部类.匿名内部类;
/*
    匿名内部类:
    1.本质是类，内部类，该类没有名字，同时还是一个对象
    2.匿名内部类是定义在外部类
    3.匿名内部类从语法上看，既有定义类的特征，也有创建对象的特征
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
        //接口的匿名内部类，使用值使用一次，后面就不在用了
        //编译类型：IA    运行类型：匿名内部类， 匿名内部类是名称由系统自动生成
        /*
            接口的匿名内部类相当于系统在内部创建了下面的类
            class AnonymousInnerClass$1 extends Person{
                  @Override
                  public void test() {
                    System.out.println("匿名内部类");
                  }
            }
         */
        IA ia = new IA(){
            @Override
            public void cry() {
                System.out.println("老虎在库库");
            }
        };
        System.out.println(ia.getClass());
        /*
           类的匿名内部类相当于系统在内部创建了下面的类
            class AnonymousInnerClass$2 extends Person{
                  @Override
                  public void test() {
                    System.out.println("匿名内部类");
                  }
            }
         */
        Person person = new Person("小红"){
            @Override
            public void test() {
                super.test();
            }
        };
        person.test();
        System.out.println(person.getClass());

        Outer outer = new Outer();
        outer.f1();
    }

}

class Outer{
    private int n1 = 10;

    public void f1(){
        Person p1 = new Person("小雷"){
            private int n1 = 91;
            @Override
            public void test() {
                System.out.println("n1=" + n1 + "\t访问外部变量n1=" + Outer.this.n1);
            }
        };
        p1.test();

//        new Person("小雷"){
//            public void test() {
//                System.out.println("n1=" + n1);
//            }
//        }.test();


    }


}

interface IA{
    void cry();
}

class Person{
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public void test(){
        System.out.println("123456");
    };
}
